package com.gray.controller;

import java.io.IOException;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

/**
 * @ServerEndpoint 注解是一个类层次的注解，它的功能主要是将目前的类定义成一个websocket服务器端,
 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 * @author Administrator
 *
 */
@ServerEndpoint("/websocket")
public class WebSocketTest {
	//用来记录当前在线连接数。应该把它设计成线程安全
	private static int onlineCount;
	
	private static CopyOnWriteArraySet<WebSocketTest> webSocketSet = new CopyOnWriteArraySet<WebSocketTest>();
	
	//与某个客户端连接会话，需要通过它来给客户端发送数据
	private Session sesseion;
	
	/**
	 * 连接成功调用的方法
	 * @param session  可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
	 */
	@OnOpen
	public void onOpen(Session session){
		this.sesseion = session;
		webSocketSet.add(this);
		System.out.println("有新连接加入");
		
	}
	
	@OnClose
	public void onClose(){
		webSocketSet.remove(this);
		
	}
	
	
	/**
	 * 收到客户端消息后调用的方法
	 * @param message  客户端发来的消息
	 * @param session
	 */
	@OnMessage
	public void onMessage(String message,Session session){
		System.out.println("来自客户端的消息："+message);
		
		for (WebSocketTest item : webSocketSet) {
			try {
				item.sendMessage(message);
			} catch (IOException e) {
				e.printStackTrace();
				continue;
			}
		}
		
	}
	
	@OnError
	public void onError(Session session,Throwable throwable){
		System.out.println("发生错误");
		throwable.printStackTrace();
	}
	
	public void sendMessage(String message) throws IOException{
			this.sesseion.getBasicRemote().sendText(message);
	}
	
	private static synchronized int getOnlineCount(){
		return onlineCount;
	}
	
	private static synchronized void addOnlineCount(){
		WebSocketTest.onlineCount++;
	}
	
	private static synchronized void subOnlineCount(){
		WebSocketTest.onlineCount--;
	}
	
	
}
